home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1996 March
/
EnigmA AMIGA RUN 05 (1996)(G.R. Edizioni)(IT)[!][issue 1996-03][Skylink CD IV].iso
/
earcd
/
program
/
bgui12.lha
/
demos
/
BGUIPlayer
/
Main.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-06-11
|
11KB
|
480 lines
/*
* MAIN.C
*/
#include "BGUIPlayer.h"
Prototype ULONG ReportError( UBYTE *, UBYTE *, ... );
Prototype struct MsgPort *SharedPort;
/*
* Global data.
*/
struct Library *BGUIBase;
Object *CO_Broker;
ULONG BrokerSig;
struct MsgPort *SharedPort;
/*
* Show a BGUI requester. Used for
* error reports and general information.
*/
ULONG ReportError( UBYTE *gads, UBYTE *string, ... )
{
struct bguiRequest req = { NULL };
req.br_GadgetFormat = gads;
req.br_TextFormat = string;
req.br_Underscore = '_';
req.br_Flags = Player ? BREQF_CENTERWINDOW|BREQF_AUTO_ASPECT|BREQF_LOCKWINDOW : BREQF_CENTERWINDOW|BREQF_AUTO_ASPECT;
return( BGUI_RequestA( Player, &req, ( ULONG * )( &string + 1 )));
}
/*
* Event handler. This routine will handle
* all incoming message traffic from the
* main window, edit window, timer and
* commodity broker.
*/
VOID MsgHandler( void )
{
ULONG rc, tmp, sigrec, type, id;
struct Window *sigwin;
BOOL running = TRUE;
do {
/*
* Let's wait for a signal...
*/
sigrec = Wait(( 1L << SharedPort->mp_SigBit ) | TimerMask | BrokerSig );
/*
* Timer message?
*/
if ( sigrec & TimerMask ) {
/*
* Valid timer message?
*/
if ( CheckTimer()) {
/*
* Reset timer/CD info and the
* pause toggle.
*/
SCSI_ReadCDInfo( 1 );
SetGadgetAttrs(( struct Gadget * )GO_Pause, Player, NULL, GA_Selected, Status == SCSI_STAT_PAUSED ? TRUE : FALSE, TAG_END );
}
}
/*
* Window message?
*/
if ( sigrec & ( 1L << SharedPort->mp_SigBit )) {
while ( sigwin = GetSignalWindow( WO_Player )) {
/*
* Read the CD information, don't reset the timer.
*/
SCSI_ReadCDInfo( 0 );
/*
* Which window was it?
*/
if ( sigwin == Player ) {
/*
* Poll messages.
*/
while (( rc = HandleEvent( WO_Player )) != WMHI_NOMORE ) {
/*
* One of the track selection buttons?
*/
if ( rc >= 1 && rc <= 20 )
/*
* Play the selected track.
*/
SCSI_PlayAudio( rc );
else {
switch ( rc ) {
case ID_INQUIRE:
/*
* Show device information.
*/
SCSI_Inquire();
break;
case ID_EDIT:
/*
* Open disk-edit window if
* it is not open yet.
*/
if ( ! Disk )
OpenDiskWindow();
break;
case ID_ABOUT:
/*
* Show info about this program.
*/
ReportError( "_OK", ISEQ_C ISEQ_B VERS " (" DATE ")\n\n"
ISEQ_N "By Jan van den Baard\n\n"
"Based on the SCSI-2 CD-ROM code from\n"
"MultiCDPlayer 1.0 by Boris Jakubaschk\n"
"and SCSIUtil 2.0 by Gary Duncan and Heiko Rath" );
break;
case WMHI_CLOSEWINDOW:
/*
* Close the player window.
*/
if ( Player )
ClosePlayerWindow();
break;
case ID_QUIT:
/*
* Bye bye.
*/
running = FALSE;
break;
case ID_HIDE:
/*
* Hide all widows.
*/
if ( Player ) ClosePlayerWindow();
if ( Disk ) CloseDiskWindow();
break;
case ID_PLAY:
/*
* Start/Continue playing.
*/
if ( Status == SCSI_STAT_PAUSED ) SCSI_PauseResume();
else if ( Status != SCSI_STAT_PLAYING ) SCSI_PlayAudio( 1 );
break;
case ID_NEXT:
/*
* Play next track.
*/
if ( Status == SCSI_STAT_PLAYING ) SCSI_PlayAudio( Track + 1 );
break;
case ID_PREV:
/*
* When less than one second played we
* play the previous track. Otherwise we
* restart the current track. Just like a
* regular CD player ;) Mine does...
*/
if ( Status == SCSI_STAT_PLAYING ) {
if ( TimeIDA == 0 && TimeIDB == 0 ) SCSI_PlayAudio( Track - 1 );
else SCSI_PlayAudio( Track );
}
break;
case ID_PAUSE:
/*
* Pause/Continue playing.
*/
SCSI_PauseResume();
break;
case ID_STOP:
/*
* Stop playing.
*/
SCSI_Stop();
break;
case ID_EJECT:
/*
* Open drive door and reset
* visuals.
*/
SCSI_Eject();
TrackID = IndexID = TimeIDA = TimeIDB = TogoIDA = TogoIDB = 0;
break;
case ID_FORWARD:
/*
* Jump ahead 10 seconds (10 frames.)
*/
if ( Status == SCSI_STAT_PLAYING ) SCSI_Jump( 750 );
break;
case ID_BACKWARD:
/*
* Jump back 10 seconds (10 frames.)
*/
if ( Status == SCSI_STAT_PLAYING ) SCSI_Jump( -750 );
break;
case ID_VOLUME:
/*
* Adjust output volume.
*/
GetAttr( SLIDER_Level, GO_Volume, &tmp );
SCSI_SetVolume( tmp, tmp, tmp, tmp );
break;
}
}
}
}
/*
* Disk editor message?
*/
if ( sigwin == Disk ) {
UBYTE *name, *str;
/*
* Poll messages.
*/
while (( rc = HandleEvent( WO_Disk )) != WMHI_NOMORE ) {
switch ( rc ) {
case WMHI_CLOSEWINDOW:
/*
* Close the disk editor.
*/
if ( Disk ) {
CloseDiskWindow();
goto setDisplay;
}
break;
case ID_DISKLIST:
/*
* Setup the selected track.
*/
if ( name = ( UBYTE * )FirstSelected( GO_DiskList ))
SetGadgetAttrs(( struct Gadget * )GO_DiskTrack, Disk, NULL, STRINGA_TextVal, name, TAG_END );
break;
case ID_TRACK:
/*
* Change the track name in the list.
*/
if ( name = ( UBYTE * )FirstSelected( GO_DiskList )) {
GetAttr( STRINGA_TextVal, GO_DiskTrack, ( ULONG * )&str );
strcpy( name, str );
BGUI_DoGadgetMethod( GO_DiskList, Disk, NULL, LVM_REPLACE, NULL, name, name );
}
break;
case ID_SAVEDISK:
/*
* Get the data from the string objects.
*/
GetAttr( STRINGA_TextVal, GO_Disk, ( ULONG * )&name );
strcpy( DiskName, name );
GetAttr( STRINGA_TextVal, GO_Artist, ( ULONG * )&name );
strcpy( Artist, name );
GetAttr( STRINGA_TextVal, GO_DiskLabel, ( ULONG * )&name );
strcpy( DiskLabel, name );
/*
* Save the file to disk.
*/
SaveDiskFile();
/*
* Close the disk editor window.
*/
CloseDiskWindow();
/*
* Setup visuals.
*/
setDisplay:
SetGadgetAttrs(( struct Gadget * )GO_Title, Player, NULL, INFO_TextFormat, DiskName, TAG_END );
SetGadgetAttrs(( struct Gadget * )GO_TrackTitle, Player, NULL, INFO_TextFormat, Status == SCSI_STAT_STOPPED ? Artist : &DiskTracks[ Track - 1 ][ 0 ], TAG_END );
break;
}
}
}
}
}
/*
* Commodity message?
*/
if ( sigrec & BrokerSig ) {
/*
* Get messages from the broker.
*/
while ( MsgInfo( CO_Broker, &type, &id, NULL ) != CMMI_NOMORE ) {
/*
* Evaluate message.
*/
switch ( type ) {
case CXM_IEVENT:
switch ( id ) {
case CXK_POPUP:
/*
* Popup the player window.
*/
if ( ! Player )
OpenPlayerWindow( TRUE );
break;
}
break;
case CXM_COMMAND:
switch ( id ) {
case CXCMD_KILL:
/*
* Bye bye.
*/
running = FALSE;
break;
case CXCMD_DISABLE:
/*
* Disable the broker.
*/
DisableBroker( CO_Broker );
break;
case CXCMD_ENABLE:
/*
* Enable the broker.
*/
EnableBroker( CO_Broker );
break;
case CXCMD_UNIQUE:
case CXCMD_APPEAR:
/*
* Open the player window.
*/
if ( ! Player )
OpenPlayerWindow( TRUE );
break;
case CXCMD_DISAPPEAR:
/*
* Close all windows.
*/
if ( Player ) ClosePlayerWindow();
if ( Disk ) CloseDiskWindow();
break;
}
break;
}
}
}
} while ( running );
}
/*
* Setup the program.
*/
static BOOL SetupBGP( void )
{
ULONG added;
/*
* Open BGUI.
*/
if ( BGUIBase = OpenLibrary( BGUINAME, BGUIVERSION )) {
/*
* Create commodity broker.
*/
CO_Broker = CommodityObject,
COMM_Name, VERS,
COMM_Title, VERS " (" DATE ")",
COMM_Description, "Compact Disk Digital Audio Player.",
COMM_Priority, 0,
COMM_ShowHide, TRUE,
EndObject;
/*
* OK?
*/
if ( CO_Broker ) {
/*
* Load preferences.
*/
LoadConfig();
/*
* Get commadity signal.
*/
GetAttr( COMM_SigMask, CO_Broker, &BrokerSig );
/*
* Add popup key.
*/
added = AddHotkey( CO_Broker, Popkey, CXK_POPUP, 0L );
/*
* OK?
*/
if ( added == 1 ) {
/*
* Setup the SCSI CD-ROM communication stuff.
*/
if ( SetupSCSI( DeviceName, DevID )) {
/*
* Is the device a CD-ROM?
*/
if ( SCSI_IsCDRom()) {
/*
* Setup the timer.deice.
*/
if ( SetupTimer()) {
/*
* Enable the broker.
*/
EnableBroker( CO_Broker );
/*
* Create the shared message port.
*/
if ( SharedPort = CreateMsgPort())
return( TRUE );
else
ReportError( "_OK", "Can't create a message port." );
KillTimer();
}
} else
ReportError( "_OK", "The device can not be established\nto be a CD-ROM player!" );
EndSCSI();
}
} else
ReportError( "_OK", "Unable to setup commodity hotkey!" );
DisposeObject( CO_Broker );
} else
ReportError( "_OK", "Unable to create a commodity object!" );
CloseLibrary( BGUIBase );
} else
Printf( "Unable to open the bgui.library V37 or better!\n" );
return( FALSE );
}
/*
* Close resources.
*/
static VOID CloseBGP( void )
{
if ( WO_Disk ) DisposeObject( WO_Disk );
if ( WO_Player ) DisposeObject( WO_Player );
if ( CO_Broker ) DisposeObject( CO_Broker );
EndSCSI();
KillTimer();
if ( SharedPort ) DeleteMsgPort( SharedPort );
CloseLibrary( BGUIBase );
}
/*
* Main entry point. Dunno if SAS takes this...
*/
int _main( int ac, char *av )
{
if ( SetupBGP()) {
SCSI_ReadCDInfo( 1 );
OpenPlayerWindow( Popup );
MsgHandler();
CloseBGP();
}
_exit( 0 );
#ifdef _DCC
extern void _waitwbmsg( void );
_waitwbmsg();
#endif
}